#ifndef __TASKQUEUE_HPP__
#define __TASKQUEUE_HPP__

#include "MutexLock.hpp"
#include "Condition.hpp"
#include <queue>
#include <functional>


using namespace std;

typedef function<void()> Task; // 任务的回调函数作为接口

class TaskQueue {
public:
    TaskQueue(int); // Constructor
    void empty(); // 判断队列是否为空
    void full(); // 判断队列是否已满
    void push(Task); // 往缓冲区中添加任务
    Task pop(); // 往缓冲区中获取任务
    void wakeup(); // 唤醒_notEmpty条件变量
private:
    MutexLock _mutex; // 互斥锁对象
    Condition _notEmpty; // 缓冲区有数据的条件变量
    Condition _notFull; // 缓冲区没有放满数据的条件变量
    size_t _size; // 队列大小
    queue<Task> _que; // 队列
    bool _flag; // 标志位，用于退出pop函数
};

#endif